<?php
/**
 * Controller_Ajax_Common
 *
 * Класс Controller_Ajax_Common отвечает за обработку запросов связанных с общими действиями для разных сущностей
 *
 * @author Егоров Александр <slamer86@gmail.com>
 * @version 2.0
 */
class Controller_Ajax_Common extends Controller_Ajax {

	/**
	 * (non-PHPdoc)
	 * @see Controller_Ajax::actionSwitch()
	 */
	public function actionSwitch() {
	  Service_Debug::setDebug();
	  switch ($this->arrRequest[2]) {
  		case 'update_field':
  			$this->updateField();
  			break;
  		case 'update_fields':
  			$this->updateFields();
  			break;
  		case 'set_user_variable':
  			$this->setUserVariable();
  			break;	
       case 'get_user_variable':
  			$this->getUserVariable();
  			break;
  		case 'delete':
  			$this->delete();
  			break;
  		case 'delete_by_ids':
  			$this->deleteByIds();
  			break;  				
  		default: throw new Exception_SiteError('', 404);
  	}
	}

	/**
	 * Редактирование поля
	 *
	 */
	public function updateField() {
	  Service_Debug::setDebug();
	  // Получаем значения
	  $essenceType = isset($_POST['essenceType']) ? Service_Escape::absolutelyEscapeString($_POST['essenceType']) : '';
		if (!isset($_POST['essenceId'])) $essenceId = 0;
		else {
			$essenceId = preg_match('/([0-9+]_)+[0-9+]/', $_POST['essenceId']) ? $_POST['essenceId'] : intval($_POST['essenceId']); 
		}
		$fieldName = isset($_POST['fieldName']) ? Service_Escape::absolutelyEscapeString($_POST['fieldName']) : '';
		$needCheck = isset($_POST['needCheck']) ? intval($_POST['needCheck']) : 1;
		$userAction = isset($_POST['userAction']) ? Service_Escape::absolutelyEscapeString($_POST['userAction']) : null;
		

		$value = isset($_POST['value']) ? Service_Escape::absolutelyEscapeString($_POST['value']) : ''; // absolutelyEscapeArray
		$oldValue = isset($_POST['oldValue']) ? Service_Escape::absolutelyEscapeString($_POST['oldValue']) : ''; // absolutelyEscapeArray
		/*
		$objParser = new Service_Editor();
		$value = $objParser->parseHTML($value);*/
		
		// Проверяем переданы ли все значения и права на изменения
		if (empty($essenceType) || empty($essenceId) || empty($fieldName) || !isset($_POST['value']))  return $this->makeStandardError('Не хватает данных');
		if (!SimpleAdministration::isAvailableMaterial($essenceType, $essenceId))  return $this->makeStandardError('Доступ запрещен');
		
		// Создаем объект
		$objEssence = Service_Essence::getObjByID($essenceType, $essenceId);

		if (!array_key_exists($fieldName, $objEssence->tableFields)) return $this->makeStandardError('Неверное поле для редактирования');
		// Проверяем на уникальность значения
		if (isset($objEssence->validatesUniquenessOf[$fieldName]) && !$objEssence->isUnique($fieldName, $value)) {
			$this->arrReturn = array('result' => 'error', 'error' => 'Такое значение уже используется', 'value' => $objEssence->getField($fieldName));
			return false;
		}
		$value = Service_Escape::replaceSpecialChars($value);
		// Выполняем проверку на последствия и если все хорошо, то обновляем значение поля
		if ($userAction) {
			$objEssence->action = $userAction;
		  $action = $objEssence->updateField($fieldName, $value);
		}
	  elseif ($needCheck) {
		  $arrConfirmText = $objEssence->hasAftermath($fieldName, $value);
		  if (empty($arrConfirmText)) {
		  	$action = $objEssence->updateField($fieldName, $value);
		  }
	  }
	  else {
	  	$action = $objEssence->updateField($fieldName, $value);
	  	
	  }
		$this->arrReturn = array('result' => 'OK');
		if (!empty($arrConfirmText)) {
		  $this->arrReturn['confirm_text'] = $arrConfirmText['confirm_text']; // Запрашиваем подтверждение если нужно
		  if (!empty($arrConfirmText['actions'])) $this->arrReturn['actions'] = $arrConfirmText['actions'];
		}
		if (!empty($action) && is_string($action)) $this->arrReturn['action'] = $action; // Вызываем обработку после 
  }

	/**
	 * Редактирование группы полей
	 *
	 */
	public function updateFields() {
	  Service_Debug::setDebug();
	  // Получаем значения
	  $essenceType = isset($_POST['essenceType']) ? Service_Escape::absolutelyEscapeString($_POST['essenceType']) : '';
		if (!isset($_POST['essenceId'])) $essenceId = 0;
		else $essenceId = preg_match('/([0-9+]_)+[0-9+]/', $_POST['essenceId']) ? $_POST['essenceId'] : intval($_POST['essenceId']);
		$arrFields = isset($_POST['fields']) ? Service_Escape::absolutelyEscapeArray($_POST['fields']) : array();
		
		// Проверяем переданы ли все значения и права на изменения
		if (empty($essenceType) || empty($essenceId) || empty($arrFields))  return $this->makeStandardError('Не хватает данных');
		if (!SimpleAdministration::isAvailableMaterial($essenceType, $essenceId))  return $this->makeStandardError('Доступ запрещен');
		
		// Создаем объект
		$objEssence = Service_Essence::getObjByID($essenceType, $essenceId);
		
		foreach ($arrFields as $fieldName => $fieldValue) {
			if (!array_key_exists($fieldName, $objEssence->tableFields)) return $this->makeStandardError('Неверное поле для редактирования (' . $fieldName . ')');
			// Проверяем на уникальность значения
			if (isset($objEssence->validatesUniquenessOf[$fieldName]) && !$objEssence->isUnique($fieldName, $fieldValue)) {
				$this->arrReturn = array('result' => 'error', 'error' => 'Такое значение уже используется', 'value' => $objEssence->getField($fieldName));
				return false;
			}
			$arrFields[$fieldName] = Service_Escape::replaceSpecialChars($fieldValue);
		}
		
		// Непосредственно сохранение
		foreach ($arrFields as $fieldName => $fieldValue) {
			$action = $objEssence->updateField($fieldName, $fieldValue);
		}
	  $this->arrReturn = array('result' => 'OK');	
  }

	/**
	 * Удаление элемента
	 *
	 */
	public function delete() {
	  Service_Debug::setDebug();
		$essenceType = isset($_POST['essenceType']) ? Service_Escape::absolutelyEscapeString($_POST['essenceType']) : '';
		if (!isset($_POST['essenceId'])) $essenceId = 0;
		else {
			$essenceId = preg_match('/([0-9+]_)+[0-9+]/', $_POST['essenceId']) ? $_POST['essenceId'] : intval($_POST['essenceId']);
		}
		$needCheck = isset($_POST['needCheck']) ? intval($_POST['needCheck']) : 1;
    $userAction = isset($_POST['userAction']) ? Service_Escape::absolutelyEscapeString($_POST['userAction']) : null;
    // Определяем корректность переданных данных и возможность удаления объекта
		if (empty($essenceType) || empty($essenceId))  return $this->makeStandardError('Не хватает данных');
		if (!SimpleAdministration::isAvailableMaterial($essenceType, $essenceId))  return $this->makeStandardError('Доступ запрещен');
		$objEssence = Service_Essence::getObjByID($essenceType, $essenceId);
		if (!$objEssence->isLoaded()) return $this->makeStandardError('Неверный объект удаления');
		
		// Определяем нужно ли будет сейчас удалить объект
		$delete = 0;
		if ($userAction) {
		  $objEssence->action = $userAction;
		  $delete = 1;
		}
	  elseif ($needCheck) {
		  $arrConfirmText = $objEssence->getImportantEssenceLinks();
		  if (empty($arrConfirmText)) $delete = 1;
	  }
	  else $delete = 1;
	  // Если требуется удалить объект, то удаляем его
	  if ($delete) {
	  	if ($objEssence->delete()) $this->arrReturn = array('result' => 'OK');
  	  else return $this->makeStandardError('Объект не был удален. Возможно, он является системным и его нельзя удалять.');
	  }
	  
		if (!empty($arrConfirmText)) {
			$this->arrReturn = array('result' => 'OK');
		  $this->arrReturn['confirm_text'] = $arrConfirmText['confirm_text']; // Запрашиваем подтверждение если нужно
		  if (!empty($arrConfirmText['actions'])) $this->arrReturn['actions'] = $arrConfirmText['actions'];
		}	  
	}
	
	/**
	 * Удаление элемента
	 *
	 */
	public function deleteByIds() {
	  Service_Debug::setDebug();
		$essenceType = isset($_POST['essenceType']) ? Service_Escape::absolutelyEscapeString($_POST['essenceType']) : '';
		$essenceIds = isset($_POST['essenceIds']) ? str_replace('\"', "'", $_POST['essenceIds']) : '';		
		$needCheck = isset($_POST['needCheck']) ? intval($_POST['needCheck']) : 1;
		
		
		if (empty($essenceType) || empty($essenceIds)) return $this->makeStandardError('Не хватает данных');
		$arrEssenceIds = json_decode($essenceIds);
		if (empty($arrEssenceIds)) return $this->makeStandardError('Не передан список сущностей');
		
		// Обезвреживаем ID
		foreach ($arrEssenceIds as $key => $essenceId) {
		  $arrEssenceIds[$key] = preg_match('/([0-9+]_)+[0-9+]/', $essenceId) ? $essenceId : intval($essenceId);
		  if (empty($arrEssenceIds[$key])) return $this->makeStandardError('Есть неверные идентификаторы');
		}		
		// Проверяем возможность удалять эти сущности
		foreach ($arrEssenceIds as $essenceId) {
		  if (!SimpleAdministration::isAvailableMaterial($essenceType, $essenceId)) return $this->makeStandardError('Доступ запрещен');
		}		
		// Проверяем существуют ли объекты
		$arrObjects = array();
		foreach ($arrEssenceIds as $i => $essenceId) {
		  $arrObjects[$i] = Service_Essence::getObjByID($essenceType, $essenceId);
		  if (!$arrObjects[$i]->isLoaded()) return $this->makeStandardError('Нет объектов для удаления');
		}		

		// Проверяем при необходимости наличие важных связей с другими сущностями. Если их нет, то удаляем объекты
		if ($needCheck) {
  		foreach ($arrObjects as $objEssence) {
  		  $importantEssenceLinks = $objEssence->getImportantEssenceLinks();
  		  if (!empty($importantEssenceLinks)) $this->arrReturn = array('result' => 'OK', 'confirm_text' => $importantEssenceLinks);
  		}	
		}
		// Удаляем объекты
		foreach ($arrObjects as $objEssence) {
      if (!$objEssence->delete()) $error = 'Некоторые объекты не были удален. Возможно, они являются системными и их нельзя удалять.';
		}			
		if (empty($error))$this->arrReturn = array('result' => 'OK');
		else return $this->makeStandardError($error);
		
	}	
	
	/**
	 * Устанавливаем значение пользовательской переменной
	 */
	public function setUserVariable() {
	  Service_Debug::setDebug();
		$variableName = isset($_POST['variable']) ? Service_Escape::absolutelyEscapeString($_POST['variable']) : '';
		$variableValue = isset($_POST['value']) ? Service_Escape::absolutelyEscapeString($_POST['value']) : '';
		
		if (empty($variableName)) return $this->makeStandardError('Не указано название переменной');
		$userId = User_User::getId();
		if (empty($userId)) return $this->makeStandardError('Не хватает прав');
		
		if (User_Variable::setVariableValue($userId, $variableName, $variableValue)) $this->arrReturn = array('result' => 'OK');
	}
	
	/**
	 * Получаем значения пользовательских переменных
	 */
	public function getUserVariable() {
	  Service_Debug::setDebug();
		$variableName = isset($_POST['variable']) ? Service_Escape::absolutelyEscapeString($_POST['variable']) : '';
		
		if (empty($variableName)) return $this->makeStandardError('Не указано название переменной');
		$userId = User_User::getId();
		if (empty($userId)) return $this->makeStandardError('Не хватает прав');
		
		$arrVariables = explode(',', $variableName);
		
		$arrValues = User_Variable::getVariableValue($userId, $arrVariables, true);
		
		$this->arrReturn = array('result' => 'OK', 'data' => $arrValues);
	}
		
}
?>